package com.qmyx.supply.admin.controller;

import com.kuaidi100.sdk.response.QueryTrackResp;
import com.ytjj.qmyx.supplychain.common.api.CommonResult;
import com.ytjj.qmyx.supplychain.mapper.entity.YxExpressOrders;
import com.ytjj.qmyx.supplychain.service.ExpressOrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

@RestController
@RequestMapping("/test")
@Slf4j
@RefreshScope
public class TestController {
//    @Autowired
//    private RoleMenuRelationService roleMenuRelationService;
//    @Autowired
//    private BankerOrderService bankerOrderService;
//    @Autowired
//    private RedisService redisService;
//    @Resource
//    private BankerOrderMapper bankerOrderMapper;
//    @Resource
//    private OrdersMapper ordersMapper;
    @Resource
    private ExpressOrderService expressOrderService;
//    @Value("${invalid.policy:1}")
//    private Integer invalidPolicy;

    @GetMapping("/check")
    public String check() {
        return "ok";
    }

    @GetMapping("/index")
    public CommonResult index() {
//        List<YxExpressOrders> expressOrdersList = expressOrderService.getExpressOrderList(1);
//        expressOrdersList.stream().forEach(item -> {
//
//            QueryTrackResp queryTrackResp = expressOrderService.testResp(item.getExpressEno());
//
//            try {
//                expressOrderService.handleExpressQueryResp(queryTrackResp, item);
//            } catch (Exception e) {
//                log.error("===阶段1定时刷新快递订单状态异常==={}", e);
//            }
//        });
        return CommonResult.success();
    }

//    @PostMapping("/updateOrderByInvalid")
//    public CommonResult updateOrderByInvalid(@RequestBody Map<String, String> dataStr) {
//        if (StringUtils.isEmpty(dataStr.get("dataStr"))) {
//            return CommonResult.success();
//        }
//        List<String> datas = Arrays.asList(dataStr.get("dataStr").split(","));
//        int moreVal = datas.size() % 100;// 10
//        int forNum = datas.size() / 100;// 1
//        if (moreVal > 0) {// 10 > 0
//            forNum = forNum + 1;// 2
//        }
//        List<String> failList = new ArrayList<>();
//        for (int i = 0; i < forNum; i++) {// 2
//            List<String> childOrderNos = null;
//            if (i == forNum - 1) { // 1 == 1
//                int toIndex = datas.size(); // 60
//                childOrderNos = datas.subList(i * 100, toIndex); // 50 ~ 60
//            }else {
//                childOrderNos = datas.subList(i * 100, i * 100 + 100); // 50
//            }
//            failList.addAll(handleOrder(childOrderNos));
//        }
//        return CommonResult.success(failList);
//    }
//
//    private List<String> handleOrder(List<String> childOrderNos) {
//        List<YxBankerOrder> bankerOrders = bankerOrderService.selectByChildOrderNos(childOrderNos);
//        List<String> failList = new ArrayList<>();
//        bankerOrders.stream().forEach(item -> {
//            if (!StringUtils.isEmpty(item.getExpressNo())) {
//                log.info("==={}已存在物流单号，无须重复操作！===", item.getChildOrderNo());
//                return;
//            }
//            String failChildOrderNo = null;
//            if (invalidPolicy.equals(1)) {
//                //1.轮询策略
//                failChildOrderNo = robinPolicy(item);
//            }else {
//                //2.找所在城市最新一条快递信息
//                failChildOrderNo = newestPolicy(item);
//            }
//            if (!StringUtils.isEmpty(failChildOrderNo)) {
//                failList.add(failChildOrderNo);
//            }
//        });
//        return failList;
//    }
//
//    /**
//     * 最新策略
//     * @param item
//     * @return
//     */
//    private String newestPolicy(YxBankerOrder item) {
//        log.info("===最新模式===");
//        Example example = new Example(YxBankerOrder.class);
//        example.createCriteria()
//                .andEqualTo("province", item.getProvince())
//                .andEqualTo("city", item.getCity())
//                .andIsNotNull("expressNo");
//        example.orderBy("deliveryTime").desc().orderBy("id").desc();
//        YxBankerOrder bankerOrder = bankerOrderMapper.selectOneByExample(example);
//        if (null == bankerOrder) {
//            log.info("===根据订单对应的城市在系统中找不到发货信息==={}", item.getChildOrderNo());
//            return item.getChildOrderNo();
//        }
//        item.setExpressCode(bankerOrder.getExpressCode());
//        item.setExpressNo(bankerOrder.getExpressNo());
//        item.setDeliveryTime(new Date());
//        bankerOrderMapper.updateByPrimaryKeySelective(item);
//        return null;
//    }
//
//    /**
//     * 轮询策略
//     * @param item
//     * @return null:表示分配成功 非null表示分配失败，并且返回失败的子订单编号
//     */
//    private String robinPolicy(YxBankerOrder item) {
//        try {
//            log.info("===轮询模式===");
//            Example example = new Example(YxBankerOrder.class);
//            example.createCriteria()
//                    .andEqualTo("province", item.getProvince())
//                    .andEqualTo("city", item.getCity())
//                    .andEqualTo("orderInfoStatus", 2)
//                    .andIsNotNull("expressNo");
//            example.orderBy("deliveryTime").desc().orderBy("id").desc();
//            //根据订单的省市区获取同地区的订单快递信息
//            List<YxBankerOrder> bankerOrders = bankerOrderMapper.selectByExample(example);
//            if (CollectionUtils.isEmpty(bankerOrders)) {
//                //匹配失败，返回失败的子订单编号
//                log.info("===根据订单对应的城市在系统中找不到发货信息==={}", item.getChildOrderNo());
//                return item.getChildOrderNo();
//            }
//
//            //是否分配成功
//            AtomicBoolean successFlag = new AtomicBoolean(false);
//            //分配次数最少的快递单位编码
//            AtomicReference<String> minExpressCode = new AtomicReference<>(new String(""));
//            //分配次数最少的快递单号
//            AtomicReference<String> minExpressNo = new AtomicReference<>("");
//            //分配最少的次数
//            AtomicReference<String> minUserNum = new AtomicReference<>("0");
//            bankerOrders.stream().forEach(record -> {
//                if (successFlag.get()) {
//                    return;
//                }
//                String redisKey = "order:expressNo:useNum:" + record.getExpressNo();
//                String redisVal = redisService.get(redisKey);
//                if (StringUtils.isEmpty(redisVal) || "0".equals(redisVal)) {
//                    redisService.set(redisKey, "1", 12L, TimeUnit.HOURS);
//                    item.setExpressCode(record.getExpressCode());
//                    item.setExpressNo(record.getExpressNo());
//                    item.setOrderInfoStatus(2);
//                    item.setIsExport(new Byte("1"));
//                    item.setDeliveryTime(new Date());
//                    bankerOrderMapper.updateByPrimaryKeySelective(item);
//                    successFlag.set(true);
//
//                    ordersMapper.updateOrderStatus(item.getChildOrderNo(), 2);
//                    return;
//                }else {
//                    if (minUserNum.get().equals("0")) {
//                        minExpressCode.set(record.getExpressCode());
//                        minExpressNo.set(record.getChildOrderNo());
//                        minUserNum.set(redisVal);
//                    }
//                }
//
//                if (Integer.parseInt(redisVal) <= Integer.parseInt(minUserNum.get())) {
//                    minExpressCode.set(record.getExpressCode());
//                    minExpressNo.set(record.getChildOrderNo());
//                    minUserNum.set(redisVal);
//                }
//            });
//            //上面循环中没有分配成功
//            if (!successFlag.get()) {
//                log.info("===循环中没有分配成功==={}", item.getChildOrderNo());
//                //没有找到合适的快递信息
//                if (StringUtils.isEmpty(minExpressCode.get()) || StringUtils.isEmpty(minExpressNo.get())) {
//                    log.info("===循环记录中没有找到合适的快递信息==={}", item.getChildOrderNo());
//                    return item.getChildOrderNo();
//                }
//                //得到分配最少的快递信息
//                String redisKey = "order:expressNo:userNum:" + minExpressNo.get();
//                String redisVal = redisService.get(redisKey);
//
//                item.setExpressCode(minExpressCode.get());
//                item.setExpressNo(minExpressNo.get());
//                item.setOrderInfoStatus(2);
//                item.setIsExport(new Byte("1"));
//                item.setDeliveryTime(new Date());
//                bankerOrderMapper.updateByPrimaryKeySelective(item);
//
//                ordersMapper.updateOrderStatus(item.getChildOrderNo(), 2);
//                //快递信息分配完一次，对应的分配次数需要+1
//                redisService.set(redisKey, String.valueOf(Integer.parseInt(null == redisVal ? "0" : redisVal) + 1), 12L, TimeUnit.HOURS);
//                return null;
//            }
//        } catch (Exception e) {
//            log.info("====处理刷单数据失败==={}", e);
//        }

//        return null;
//    }
}
